import axios from 'axios'
import type {InternalAxiosRequestConfig} from "axios"
import {addAxiosReqInterceptor, addAxiosRespInterceptor} from 'st-common-req'
import AxiosNamespace from "st-common-req/axios-namespace"
import {SimpleTypeConst} from "st-common-core"
import {EnvNameEnum} from "@config"
import {getEnv} from "@env"
import {genEncryptKeyHandler, encryptReqDataHandler, decryptResDataHandler} from '@encrypt'
import {reqDataJsonStringifyHandler} from './utils/req-data-json-stringify-util.ts'
import {resDataJsonParseAfterDecryptHandler} from './utils/res-data-json-parse-util.ts'
import {reqDataRemoveUndefinedUtil} from './utils/req-data-remove-undefined-util.ts'

/**
 * 创建 axios 实例对象
 */
const request = axios.create({
  baseURL: getEnv(EnvNameEnum.SERVER_PROTOCOL) + '://'
    + getEnv(EnvNameEnum.SERVER_HOST) + ':'
    + getEnv(EnvNameEnum.SERVER_PORT)
    + getEnv(EnvNameEnum.SERVER_BASEURL),
  timeout: getEnv<number>(EnvNameEnum.REQ_TIMEOUT, SimpleTypeConst.INT),
})

/**
 * 为 axios 实例对象添加请求拦截器
 * 对发送的请求进行统一预处理
 */
addAxiosReqInterceptor(
  request as AxiosNamespace.AxiosInstance,
  (conf) => {
    const config = conf as InternalAxiosRequestConfig
    // 移除请求数据中值为 undefined 的属性
    reqDataRemoveUndefinedUtil(config)
    // 对请求数据 JSON.stringify 处理
    reqDataJsonStringifyHandler(config)
    // 生成请求数据加密密钥的处理
    const key = genEncryptKeyHandler(config)
    // 请求数据加密的处理
    encryptReqDataHandler(config, key)
  },
)

/**
 * 为 axios 实例对象添加响应拦截器
 * 对请求的响应进行统一预处理
 */
addAxiosRespInterceptor(
  request as AxiosNamespace.AxiosInstance,
  (res, headers) => {
    // 响应数据解密的处理
    decryptResDataHandler(res, headers)
    // 对响应数据进行 JSON.parse 处理
    return resDataJsonParseAfterDecryptHandler(res)
  },
  (message) => {
    return Promise.resolve({
      status: false,
      message,
    })
  }
)

export default request
